import http from '../request.js'
import { API_ENDPOINTS } from '../config.js'

/**
 * 用户相关API模块
 * 包含用户资料、密码修改、身份认证等功能
 */
class UserAPI {
  /**
   * 获取用户资料
   */
  async getUserProfile(retryCount = 0) {
    try {
      // 添加调试信息
      const token = http.getToken()
      const userInfo = uni.getStorageSync('user_info')
      console.log('🔍 获取用户资料 - 调试信息:', {
        endpoint: API_ENDPOINTS.USERS.PROFILE,
        hasToken: !!token,
        tokenLength: token ? token.length : 0,
        hasUserInfo: !!userInfo,
        userId: userInfo?.id,
        retryCount
      })
      
      const result = await http.get(API_ENDPOINTS.USERS.PROFILE)
      
      // 检查是否需要重试（token刷新后）
      if (result.needRetry && retryCount < 1) {
        console.log('🔄 Token已刷新，重新获取用户资料...')
        return await this.getUserProfile(retryCount + 1)
      }
      
      return result
    } catch (error) {
      console.error('获取用户资料失败:', error)
      console.error('错误详细信息:', {
        message: error.message,
        statusCode: error.statusCode,
        endpoint: API_ENDPOINTS.USERS.PROFILE,
        hasToken: !!http.getToken()
      })
      throw error
    }
  }

  /**
   * 提交实名认证
   * @param {Object} data 认证数据
   * @param {String} data.realName 真实姓名
   * @param {String} data.idCard 身份证号
   * @param {String} data.idCardFront 身份证正面照片URL
   * @param {String} data.idCardBack 身份证反面照片URL
   */
  async submitVerification(data) {
    try {
      // 获取当前用户ID
      const userInfo = uni.getStorageSync('user_info')
      const userId = userInfo?.id
      
      if (!userId) {
        throw new Error('用户信息不存在，请重新登录')
      }
      
      // 调用创建认证资料API
      const result = await http.post(`/users/${userId}/identity-profile`, data)
      return result
    } catch (error) {
      console.error('提交实名认证失败:', error)
      throw error
    }
  }

  /**
   * 更新用户类型（成为出租方）
   * @param {String} userType 用户类型 OWNER | RENTER
   */
  async updateUserType(userType) {
    try {
      const result = await http.put('/users/user-type', { userType })
      console.log('✅ 用户类型更新成功:', result)
      return result
    } catch (error) {
      console.error('更新用户类型失败:', error)
      throw error
    }
  }

  /**
   * 更新用户资料
   * @param {Object} data 用户资料数据
   * @param {String} data.nickname 昵称
   * @param {String} data.avatar 头像URL
   * @param {String} data.email 邮箱
   */
  async updateProfile(data) {
    try {
      // 添加调试信息
      const token = http.getToken()
      console.log('🔍 更新用户资料 - 调试信息:', {
        endpoint: API_ENDPOINTS.USERS.UPDATE_PROFILE,
        data: data,
        hasToken: !!token,
        tokenLength: token ? token.length : 0
      })
      
      const result = await http.put(API_ENDPOINTS.USERS.UPDATE_PROFILE, data)
      console.log('✅ 更新用户资料成功:', result)
      return result
    } catch (error) {
      console.error('更新用户资料失败:', error)
      console.error('更新错误详细信息:', {
        message: error.message,
        statusCode: error.statusCode,
        endpoint: API_ENDPOINTS.USERS.UPDATE_PROFILE,
        data: data,
        hasToken: !!http.getToken()
      })
      throw error
    }
  }

  /**
   * 修改密码
   * @param {Object} data 密码数据
   * @param {String} data.oldPassword 原密码
   * @param {String} data.newPassword 新密码
   */
  async changePassword(data) {
    try {
      const result = await http.put(API_ENDPOINTS.USERS.CHANGE_PASSWORD, data)
      return result
    } catch (error) {
      console.error('修改密码失败:', error)
      throw error
    }
  }

  /**
   * 创建或更新身份认证资料
   * @param {Object} data 身份认证数据
   * @param {String} data.realName 真实姓名
   * @param {String} data.idCard 身份证号
   * @param {String} data.companyName 公司名称（可选）
   * @param {String} data.businessLicense 营业执照号（可选）
   * @param {String} data.address 地址
   */
  async createIdentityProfile(data) {
    try {
      const result = await http.post('/users/identity-profile', data)
      return result
    } catch (error) {
      console.error('创建身份认证资料失败:', error)
      throw error
    }
  }

  /**
   * 获取身份认证资料
   */
  async getIdentityProfile() {
    try {
      const result = await http.get('/users/identity-profile')
      return result
    } catch (error) {
      console.error('获取身份认证资料失败:', error)
      throw error
    }
  }

  /**
   * 更新身份认证资料
   * @param {Object} data 身份认证数据
   */
  async updateIdentityProfile(data) {
    try {
      const result = await http.put('/users/identity-profile', data)
      return result
    } catch (error) {
      console.error('更新身份认证资料失败:', error)
      throw error
    }
  }

  /**
   * 上传身份证照片
   * @param {String} filePath 文件路径
   * @param {String} type 照片类型：front/back
   */
  async uploadIdCard(filePath, type) {
    try {
      const result = await http.upload(
        '/users/upload-idcard',
        filePath,
        { type },
        { name: 'idcard' }
      )
      return result
    } catch (error) {
      console.error('上传身份证照片失败:', error)
      throw error
    }
  }

  /**
   * 上传营业执照照片
   * @param {String} filePath 文件路径
   */
  async uploadBusinessLicense(filePath) {
    try {
      const result = await http.upload(
        '/users/upload-business-license',
        filePath,
        {},
        { name: 'license' }
      )
      return result
    } catch (error) {
      console.error('上传营业执照照片失败:', error)
      throw error
    }
  }

  /**
   * 上传头像
   * @param {String} filePath 头像文件路径
   */
  async uploadAvatar(filePath) {
    try {
      const result = await http.upload(
        '/users/upload-avatar',
        filePath,
        {},
        { name: 'avatar' }
      )
      return result
    } catch (error) {
      console.error('上传头像失败:', error)
      throw error
    }
  }

  /**
   * 获取用户统计信息
   */
  async getUserStats(retryCount = 0) {
    try {
      const result = await http.get('/users/stats')
      
      // 检查是否需要重试（token刷新后）
      if (result.needRetry && retryCount < 1) {
        console.log('🔄 Token已刷新，重新获取用户统计...')
        return await this.getUserStats(retryCount + 1)
      }
      
      return result
    } catch (error) {
      console.error('获取用户统计失败:', error)
      throw error
    }
  }

  /**
   * 获取用户活动记录
   * @param {Object} params 查询参数
   */
  async getUserActivity(params = {}) {
    try {
      const result = await http.get('/users/activity', params)
      return result
    } catch (error) {
      console.error('获取用户活动记录失败:', error)
      throw error
    }
  }

  /**
   * 绑定微信
   * @param {String} code 微信授权码
   */
  async bindWechat(code) {
    try {
      const result = await http.post('/users/bind-wechat', { code })
      return result
    } catch (error) {
      console.error('绑定微信失败:', error)
      throw error
    }
  }

  /**
   * 解绑微信
   */
  async unbindWechat() {
    try {
      const result = await http.delete('/users/unbind-wechat')
      return result
    } catch (error) {
      console.error('解绑微信失败:', error)
      throw error
    }
  }

  /**
   * 绑定手机号
   * @param {String} phone 手机号
   * @param {String} code 验证码
   */
  async bindPhone(phone, code) {
    try {
      const result = await http.post('/users/bind-phone', { phone, code })
      return result
    } catch (error) {
      console.error('绑定手机号失败:', error)
      throw error
    }
  }

  /**
   * 更换手机号
   * @param {String} oldPhone 原手机号
   * @param {String} oldCode 原手机验证码
   * @param {String} newPhone 新手机号
   * @param {String} newCode 新手机验证码
   */
  async changePhone(oldPhone, oldCode, newPhone, newCode) {
    try {
      const result = await http.put('/users/change-phone', {
        oldPhone,
        oldCode,
        newPhone,
        newCode
      })
      return result
    } catch (error) {
      console.error('更换手机号失败:', error)
      throw error
    }
  }

  /**
   * 获取收藏列表
   * @param {Object} params 查询参数
   */
  async getFavorites(params = {}) {
    try {
      const result = await http.get(API_ENDPOINTS.FAVORITES.LIST, params)
      return result
    } catch (error) {
      console.error('获取收藏列表失败:', error)
      throw error
    }
  }

  /**
   * 添加收藏
   * @param {String} deviceId 设备ID
   */
  async addFavorite(deviceId) {
    try {
      const result = await http.post(API_ENDPOINTS.FAVORITES.ADD, { deviceId })
      return result
    } catch (error) {
      console.error('添加收藏失败:', error)
      throw error
    }
  }

  /**
   * 取消收藏
   * @param {String} deviceId 设备ID
   */
  async removeFavorite(deviceId) {
    try {
      const result = await http.delete(`${API_ENDPOINTS.FAVORITES.REMOVE}/${deviceId}`)
      return result
    } catch (error) {
      console.error('取消收藏失败:', error)
      throw error
    }
  }

  /**
   * 检查是否已收藏
   * @param {String} deviceId 设备ID
   */
  async checkFavorite(deviceId) {
    try {
      const result = await http.get(`/favorites/check/${deviceId}`)
      return result
    } catch (error) {
      console.error('检查收藏状态失败:', error)
      throw error
    }
  }

  /**
   * 获取消息通知列表
   * @param {Object} params 查询参数
   */
  async getNotifications(params = {}) {
    try {
      const result = await http.get('/users/notifications', params)
      return result
    } catch (error) {
      console.error('获取通知列表失败:', error)
      throw error
    }
  }

  /**
   * 标记通知为已读
   * @param {String} notificationId 通知ID
   */
  async markNotificationRead(notificationId) {
    try {
      const result = await http.put(`/users/notifications/${notificationId}/read`)
      return result
    } catch (error) {
      console.error('标记通知已读失败:', error)
      throw error
    }
  }

  /**
   * 批量标记通知为已读
   * @param {Array} notificationIds 通知ID数组
   */
  async batchMarkNotificationsRead(notificationIds) {
    try {
      const result = await http.put('/users/notifications/batch-read', {
        notificationIds
      })
      return result
    } catch (error) {
      console.error('批量标记通知已读失败:', error)
      throw error
    }
  }

  /**
   * 删除通知
   * @param {String} notificationId 通知ID
   */
  async deleteNotification(notificationId) {
    try {
      const result = await http.delete(`/users/notifications/${notificationId}`)
      return result
    } catch (error) {
      console.error('删除通知失败:', error)
      throw error
    }
  }

  /**
   * 获取未读通知数量
   */
  async getUnreadNotificationCount() {
    try {
      const result = await http.get('/users/notifications/unread-count')
      return result
    } catch (error) {
      console.error('获取未读通知数量失败:', error)
      throw error
    }
  }

  /**
   * 更新通知设置
   * @param {Object} settings 通知设置
   */
  async updateNotificationSettings(settings) {
    try {
      const result = await http.put('/users/notification-settings', settings)
      return result
    } catch (error) {
      console.error('更新通知设置失败:', error)
      throw error
    }
  }

  /**
   * 获取通知设置
   */
  async getNotificationSettings() {
    try {
      const result = await http.get('/users/notification-settings')
      return result
    } catch (error) {
      console.error('获取通知设置失败:', error)
      throw error
    }
  }

  /**
   * 申请删除账号
   * @param {String} reason 删除原因
   * @param {String} password 确认密码
   */
  async requestDeleteAccount(reason, password) {
    try {
      const result = await http.post('/users/request-delete', {
        reason,
        password
      })
      return result
    } catch (error) {
      console.error('申请删除账号失败:', error)
      throw error
    }
  }

  /**
   * 注销账号
   */
  async deactivateAccount() {
    try {
      const result = await http.put('/users/deactivate')
      return result
    } catch (error) {
      console.error('注销账号失败:', error)
      throw error
    }
  }

  /**
   * 激活账号
   */
  async activateAccount() {
    try {
      const result = await http.put('/users/activate')
      return result
    } catch (error) {
      console.error('激活账号失败:', error)
      throw error
    }
  }

  /**
   * 举报用户
   * @param {String} userId 被举报用户ID
   * @param {String} reason 举报原因
   * @param {String} description 详细描述
   */
  async reportUser(userId, reason, description) {
    try {
      const result = await http.post('/users/report', {
        userId,
        reason,
        description
      })
      return result
    } catch (error) {
      console.error('举报用户失败:', error)
      throw error
    }
  }
}

// 创建实例并导出
const userAPI = new UserAPI()
export default userAPI 